﻿using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using AssessmentTool.Controls;
using System.Threading;
using ModelLayer;
using AssessmentTool.ServiceBridge;
using System.Collections.Generic;
using System.Linq;
using AssessmentTool.PresentationLogic.EventArguments;
using AssessmentTool.Services.DTO;
using AssessmentTool.PresentationLogic.PDF;
using AssessmentTool.Services;
namespace AssessmentTool.PresentationLogic.Controllers
{
    public class PanelCompetenzeController : AbstractController<PanelCompetenze>
    {
        public int maxCompetenze = 0;
        public int totCompetenzeRisposte = 0;
        PDFGenerator pdfGenerator;
        public PanelCompetenzeController(PanelCompetenze element)
            : base(element)
        {
            ed.subscrive("LOGGED-IN", initCompetenze);
            ed.subscrive("REFRESH", initCompetenze);
            ed.subscrive("CLEARCOMPETENZE", clearCompetenze);
            ed.subscrive("ENDBUILDCOMPENTENZE", endBuild);
            ed.subscrive("CONTROLLOAVANZAMENTO", controlloStatoAvanzamentoAssessment);
            ed.subscrive("CONSOLIDATO", consolida);
            ed.subscrive("EXPORTPDF", onExportPdf);
            ed.subscrive("SAVE", save);
            ed.subscrive("SAVED", onSaved);
            ed.subscrive("ONLOGOUT", onRichiestaLogout);
            pdfGenerator = new PDFGenerator();
        }

        public void onExportPdf(EventArgs e)
        {
            pdfGenerator.generateCompetenzePDF();
        }
        public void clearCompetenze(EventArgs e)
        {
            element.clearCompetenze();
        }

        private void generateCompetenceThread()
        {
            dispatcher.BeginInvoke(delegate()
            {
                UtenteTrackingHelper.pulisciUtente(false);
                element.clearCompetenze();
                Utente utente = (Utente)Session.getInstance().getValue("USER");
                ModelloServiceBridge.getCompetenze(utente.Username, proxy_getModelloFromUtenteCompleted);
            });

        }

        public void consolida(EventArgs e)
        {
            UtenteLogged ul = (UtenteLogged)Session.getInstance().getValue("USERLOGGED");
            foreach( IContainer container in element.container.Children)
            {
                container.enableRisposta(ul.grantModificaModello);
            }
            ed.dispatch("ENABLEDISABLEBUTTON", new MenuButtonEventArgs() { Name = "Profili", Enable = ul.grantVisualizzaProfilo });
        }

        public void proxy_getModelloFromUtenteCompleted(object sender, AssessmentTool.Services.getModelloFromUtenteCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                EventDispatcher.getInstance().dispatch("SHOWMESSAGE", new ShowMessageEventArgs()
                {
                    Testo = "Attenzione! Errore critico nel reperimento del modello...",
                    Error = true,
                    Critico = true
                });
            }
            else
            {
                Modello m = e.Result;
                CompetenzaBuilder.getInstance().generateCompetezaTree(element, m);
                EventDispatcher.getInstance().dispatch("ENDBUILDCOMPENTENZE", null);
            }
        }

        public void initCompetenze(EventArgs e)
        {
            
            ed.dispatch("BUSY", null);
            Thread a = new Thread(generateCompetenceThread);
            a.Start();
        }

        public void addTotaleCompetenze()
        {
            maxCompetenze++;
        }

        public void addRisposta()
        {
            totCompetenzeRisposte++;
        }
        public void controlloStatoAvanzamentoAssessment(EventArgs e)
        {
            if (totCompetenzeRisposte == maxCompetenze)
            {
                ed.dispatch("ASSESSMENTCOMPLETATO", null);
            }

        }
        public void endBuild(EventArgs e)
        {
            controlloStatoAvanzamentoAssessment(e);
            ed.dispatch("STOPBUSY", null);
                
        }
        void save(EventArgs e)
        {
            ed.dispatch("BUSY", null);
            Utente u = (Utente)Session.getInstance().getValue("USER");
            if (u.Risposte.Count > 0)
                UtenteServiceBridge.saveChanges(u, proxy_saveChangesCompleted);
            else
            {

                ed.dispatch("STOPBUSY", null);
                ed.dispatch("SHOWMESSAGE", new ShowMessageEventArgs() { Testo = "Non è stata effettuata nessuna modifica...", Error = false });

            }
        }
        void proxy_saveChangesCompleted(object sender, saveChangesCompletedEventArgs e)
        {
            ed.dispatch("STOPBUSY", null);
            if (e.Error == null)
            {
                ed.dispatch("SAVED", null);
            }
            else
            {
                ed.dispatch("SHOWMESSAGE", new ShowMessageEventArgs()
                {
                    Testo = "Attenzione! Errore nel salvataggio del modello..\n" +
                        "Se l'errore dovesse ripresentarsi si prega di aggiornare il modello con il tasto annulla o rieffettuare il login.",
                    Error = true,
                    Critico = false
                });
            }

        }
        public void onSaved(EventArgs e)
        {

            UtenteTrackingHelper.pulisciUtente(true);

            ed.dispatch("CONTROLLOAVANZAMENTO", null);
        }
        public void onRichiestaLogout(EventArgs e)
        {
            Utente u = (Utente)Session.getInstance().getValue("USER");
            if (u == null)
                return;
            if (u.Risposte.Count > 0)
            {
                ed.dispatch("STOPBUSY", null);
                ModalWindow ew = new ModalWindow();
                ew.Show("Attenzione!", "Il modello presenta delle modifiche non salvate.\n" +
                                      "Vuoi comunque uscire perdendo le modifiche effettuate?", ModalType.YESNO, "LOGOUT", null);


            }
            else
            {

                ed.dispatch("LOGOUT", null);
            }
        }
       
    }
}
